package com.br.negocio.vo;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;

@Entity
@Table(name = "veiculo")
@SequenceGenerator(name = "veiculo_seq", sequenceName = "veiculo_cod_veiculo_seq", allocationSize = 1)
@NamedQueries ({
	@NamedQuery(name = "loadAllVeiculo", query = "from VeiculoVO as v order by v.codigo"),
	@NamedQuery(name = "loadAllVeiculoPorTipo", query = "from VeiculoVO as v where v.tipoVeiculo = :tipo_veiculo order by v.codigo"),
	@NamedQuery(name = "loadAllVeiculoPorTipoEStatus", query = "from VeiculoVO as v where (v.tipoVeiculo = :tipo_veiculo and v.statusVeiculo = :status_veiculo) order by v.codigo"),
	@NamedQuery(name = "findVeiculo", query = "from VeiculoVO as v where v.codigo = :codigo"),
	@NamedQuery(name = "findDuplicatedVeiculo", query = "from VeiculoVO as v where (v.placa = :placa or v.chassi = :chassi) and v.codigo != :codigo")
})
public class VeiculoVO implements Serializable {

	private static final long serialVersionUID = 1L;
	
	@Id
	@Column(name = "cod_veiculo")
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "veiculo_seq")
	private int codigo;
	
	@Column(name = "chassi", unique = true, nullable = false, length = 20)
	private String chassi;
	
	@Column(name = "placa", unique = true, nullable = false, length = 8)
	private String placa;
	
	@Column(name = "ano_fabricacao", nullable = false, length = 4)
	private String anoFabricacao;
	
	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "cod_cor", nullable = false)
	@Fetch(FetchMode.JOIN)
	private CorVO corVO;
	
	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "cod_modelo", nullable = false)
	@Fetch(FetchMode.JOIN)
	private ModeloVO modeloVO;
	
	@Column(name = "qtdPassageiros", nullable = false)
	private int qtdPassageiros;
	
	@Column(name = "numero_eixos", nullable = false)
	private int numeroEixos;
	
	@Column(name = "tipo_combustivel")
	private int tipoCombustivel;
	
	@Column(name = "observacoes", length = 200)
	private String observacoes;
	
	@Column(name = "cod_tipo_veiculo", nullable = false)
	private int tipoVeiculo;
	
	@Column(name = "cod_status", nullable = false)
	private int statusVeiculo;
	
	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "data_criacao", nullable = false)
	private Date dataCriacao;
	
	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "data_alteracao", nullable = false)
	private Date dataAlteracao;
	
	public VeiculoVO() {

	}

	public int getCodigo() {
		return this.codigo;
	}

	public void setCodigo(int codigo) {
		this.codigo = codigo;
	}
	
	public String getChassi() {
		return this.chassi;
	}

	public void setChassi(String chassi) {
		this.chassi = chassi;
	}

	public String getPlaca() {
		return this.placa;
	}

	public void setPlaca(String placa) {
		this.placa = placa;
	}

	public String getAnoFabricacao() {
		return this.anoFabricacao;
	}

	public void setAnoFabricacao(String anoFabricacao) {
		this.anoFabricacao = anoFabricacao;
	}
	
	public CorVO getCorVO() {
		return this.corVO;
	}

	public void setCorVO(CorVO corVO) {
		this.corVO = corVO;
	}

	public ModeloVO getModeloVO() {
		return this.modeloVO;
	}

	public void setModeloVO(ModeloVO modeloVO) {
		this.modeloVO = modeloVO;
	}
	
	public int getQtdPassageiros() {
		return qtdPassageiros;
	}

	public void setQtdPassageiros(int qtdPassageiros) {
		this.qtdPassageiros = qtdPassageiros;
	}

	public int getNumeroEixos() {
		return this.numeroEixos;
	}

	public void setNumeroEixos(int numeroEixos) {
		this.numeroEixos = numeroEixos;
	}
	
	public int getTipoCombustivel() {
		return this.tipoCombustivel;
	}

	public void setTipoCombustivel(int tipoCombustivel) {
		this.tipoCombustivel = tipoCombustivel;
	}

	public int getTipoVeiculo() {
		return tipoVeiculo;
	}

	public void setTipoVeiculo(int tipoVeiculo) {
		this.tipoVeiculo = tipoVeiculo;
	}
	
	public int getStatusVeiculo() {
		return statusVeiculo;
	}

	public void setStatusVeiculo(int statusVeiculo) {
		this.statusVeiculo = statusVeiculo;
	}

	public String getObservacoes() {
		return this.observacoes;
	}

	public void setObservacoes(String observacoes) {
		this.observacoes = observacoes;
	}

	public Date getDataCriacao() {
		return this.dataCriacao;
	}

	public void setDataCriacao(Date dataCriacao) {
		this.dataCriacao = dataCriacao;
	}

	public Date getDataAlteracao() {
		return this.dataAlteracao;
	}

	public void setDataAlteracao(Date dataAlteracao) {
		this.dataAlteracao = dataAlteracao;
	}
		
}